package com.vdongchina.miniapp.http.service;

import com.github.lianjiatech.retrofit.spring.boot.annotation.RetrofitClient;
import com.vdongchina.miniapp.constants.MiniAppConstants;
import com.vdongchina.miniapp.http.dto.*;
import retrofit2.Call;
import retrofit2.http.*;

import java.util.List;
import java.util.Map;

/**
 * Copyright (C)
 * FileName: MiniAppService
 * Author:   maokai
 * Date:     2021/8/12 14:46
 * Description:
 */
@RetrofitClient(baseUrl = "https://developer.toutiao.com/")
public interface IAppHttpService extends IAppService {


    /**
     * access_token 是小程序的全局唯一调用凭据，
     * 开发者调用小程序支付时需要使用 access_token。access_token 的有效期为 2 个小时，
     * 需要定时刷新 access_token，重复获取会导致之前一次获取的 access_token 的有效期缩短为 5 分钟。
     */
    @GET(MiniAppConstants.TOKEN)
    @Headers(value = "content-type:application/json")
    Call<AppTokenResp> getMiniAppToken(@Query(value = "appid") String appId,
                                       @Query(value = "secret") String secret,
                                       @Query(value = "grant_type") String grantType);

    /**
     * 通过login接口获取到登录凭证后，开发者可以通过服务器发送请求的方式获取 session_key 和 openId。
     * Tip：登录凭证 code，anonymous_code 只能使用一次，非匿名需要 code，
     * 非匿名下的 anonymous_code 用于数据同步，匿名需要 anonymous_code。
     */
    @GET(MiniAppConstants.JSCODE2SESSION)
    Call<JsCodeResp> jscode2session(@Query(value = "appid") String appid,
                                 @Query(value = "secret") String secret,
                                 @Query(value = "code") String code,
                                 @Query(value = "anonymous_code") String anonymousCode);

    /**
     * 以 key-value 形式存储用户数据到小程序平台的云存储服务。
     * 若开发者无内部存储服务则可接入，免费且无需申请。
     * 一般情况下只存储用户的基本信息，禁止写入大量不相干信息。
     */
    @POST(MiniAppConstants.SET_USER_STORAGE)
    Call<AppResp> setUserStorage(@Query(value = "access_token") String accessToken,
                                      @Query(value = "openid") String openid,
                                      @Query(value = "signature") String signature,
                                      @Query(value = "sig_method") String sigMethod,
                                      @Body List<Map<String, Object>> body);

    /**
     * 删除存储到字节跳动的云存储服务的 key-value 数据。
     * 当开发者不需要该用户信息时，需要删除，以免占用过大的存储空间。
     */
    @POST(MiniAppConstants.REMOVE_USER_STORAGE)
    Call<AppResp> removeUserStorage(@Query(value = "access_token") String accessToken,
                                         @Query(value = "openid") String openid,
                                         @Query(value = "signature") String signature,
                                         @Query(value = "sig_method") String sigMethod,
                                         @Body() List<String> body);

    /**
     * 获取小程序/小游戏的二维码。该二维码可通过任意 app 扫码打开，
     * 能跳转到开发者指定的对应字节系 app 内拉起小程序/小游戏，
     * 并传入开发者指定的参数。通过该接口生成的二维码，永久有效，暂无数量限制。
     */
    @POST(MiniAppConstants.QRCODE)
    Call<byte[]> qrcode(@Body QrcodeRequest request);

    /**
     * 内容安全检测
     */
    @POST(MiniAppConstants.TEXT_ANTIDIRT)
    Call<AntidirtResp> antidirt(@Header(value = "X-Token") String accessToken,
                           @Body AntidirtRequest body);

    /**
     * 图片检测 V2
     */
    @POST(MiniAppConstants.CENSOR_IMAGE)
    Call<ImageResp> censorImage(@Body CensorImageRequest body);

    /**
     * 订阅消息推送
     */
    @POST(MiniAppConstants.SUBSCRIBE_NOTIFICATION)
    Call<SettleResp> subscribeNotification(@Body SubscribeNotifyRequest body);
}
